#include "LecteurSymbole.h"
#include <ctype.h>
#include <string.h>
#include <iostream>
using namespace std;

////////////////////////////////////////////////////////////////////////////////
LecteurSymbole::LecteurSymbole(string nomFich) :
	lc(nomFich), symCour("") {
	suivant(); // pour lire le premier symbole
}

////////////////////////////////////////////////////////////////////////////////
void LecteurSymbole::suivant() {
	sauterSeparateurs();
	// on est maintenant positionne sur le premier caractère d'un symbole
	ligne=lc.getLigne();
	colonne=lc.getColonne();
	symCour=Symbole(motSuivant()); // on reconstruit symCour avec le nouveau mot lu
}

////////////////////////////////////////////////////////////////////////////////
void LecteurSymbole::sauterSeparateurs() {
	string l ="";
	while (lc.getCarCour()==' '  ||
		   lc.getCarCour()=='\t' ||
		   lc.getCarCour()=='\r' ||
		   lc.getCarCour()=='\n' ||
		   lc.getCarCour() == '#')
			{
				if(lc.getCarCour() == '#')
					// début d'un commentaire à sauter
					sauterCommentaires();

				lc.suivant();
			}
}

////////////////////////////////////////////////////////////////////////////////
void LecteurSymbole::sauterCommentaires()
{
		if(lc.getCarCour()=='#')
		{
			while(lc.getCarCour() != '\n')	// Tant qu'on est pas au bout de la ligne
			{
				lc.suivant(); 	// On passe au caractère suivant
			}
		}
}

////////////////////////////////////////////////////////////////////////////////
string LecteurSymbole::motSuivant() {
	static string  s;
	s="";
	if (isdigit(lc.getCarCour())) {
		// c'est le début d'un entier
		bool isFloat = false;

		do {
			if ( lc.getCarCour() == '.') {
				if(!isFloat)
					isFloat = true;
				else
				{
					cout << "Error in float syntax at line " << getLigne() << endl;
					exit(0);
				}
			}
			s=s+lc.getCarCour();
			lc.suivant();

		} while ((isdigit(lc.getCarCour()) || lc.getCarCour() == '.'));
	}
	else if (isalpha(lc.getCarCour()))
		// c'est le début d'un mot
		do {
			s=s+lc.getCarCour();
			lc.suivant();
		} while (isalpha(lc.getCarCour())  ||
				 isdigit(lc.getCarCour()) ||
				 lc.getCarCour()=='_');
	else if (lc.getCarCour() == '"')
	{
		// début d'une chaine
		do {
			s=s+lc.getCarCour();
			lc.suivant();
			if(lc.getCarCour() == EOF)
			{
				// Si on est arrivé à la fin du fichier sans rencontrer le ' " ' final, on retourne une erreur.
				cout << "Missing  " << '"' << " at line " << getLigne() << endl;
				exit(0);
			}
		} while (lc.getCarCour() != '"'); // on lit tant qu'on a pas rencontré le ' " ' qui termine la chaine commencée
		s=s+lc.getCarCour();
		lc.suivant();

	}
	else if (lc.getCarCour()!=EOF)
	// c'est un caractere special
	{
		if( lc.getCarCour() == '=' or lc.getCarCour() == '!' or lc.getCarCour() == '<' or lc.getCarCour() == '>' )
		{
			s += lc.getCarCour();
			lc.suivant();
			if( lc.getCarCour() == '=')
			{
				s += lc.getCarCour();
				lc.suivant();
			}
		}
		else
		{
			s += lc.getCarCour();
			lc.suivant();
		}

	}
	return s;
}
